package prirprojekt;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;


public final class Wykres extends JFrame {

    private int winHeight = 600;
    private int winWidth = 860;
    private int workWidth = 800;
    private int pxPerUnit = 0;
    private Roj r;
    private int liczbaCPU;
    private int liczbaZadan;
    private int czasZakonczenia;
    private int[][] czasyZakonczenia;
    private int[][] czasyRozpoczecia;

    Wykres(Roj r) {
        super();
        this.r = r;
        setInformations();
        czasyRozpoczecia = new int[liczbaZadan][liczbaCPU];
        czasyZakonczenia = new int[liczbaZadan][liczbaCPU];
        calcTimes();
        pxPerUnit = workWidth / czasZakonczenia;

        this.setLayout(null);
        this.setBounds(100, 100, winWidth, winHeight);
        this.setVisible(true);


    }

    @Override
    public void paint(Graphics g) {
        //g.drawRect(100, 100, 100, 100);
        int tTop = 50;
        int tLewo = 30;
        int wysPaska = 50;

        int tmp = 0;

        g.setColor(Color.white);
        g.fillRect(tLewo - 10, tTop - 10, workWidth + 20, 540);

        for (int zadanie = 0; zadanie < liczbaZadan; zadanie++) {
            int red = (int) (Math.random() * 256);
            int gr = (int) (Math.random() * 256);
            int b = 255 - (int)(Math.random() * 256);

            Color c = new Color(red, gr, b);
            g.setColor(c);
            for (int cpu = 0; cpu < liczbaCPU; cpu++) {
                tmp = r.permutacjeZadan[r.permutacjeZadan.length - 1].tablicaZadan[zadanie].czasyNaCPU[cpu];
                g.fillRect(tLewo + (czasyRozpoczecia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska), tmp * pxPerUnit, wysPaska);
            }
            g.setColor(Color.BLACK);
            for (int cpu = 0; cpu < liczbaCPU; cpu++) {
                g.drawLine(tLewo + (czasyRozpoczecia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska), tLewo + (czasyRozpoczecia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska) + wysPaska);
                g.drawLine(tLewo + (czasyZakonczenia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska), tLewo + (czasyZakonczenia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska) + wysPaska);
                g.drawLine(tLewo + (czasyRozpoczecia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska), tLewo + (czasyZakonczenia[zadanie][cpu] * pxPerUnit), tTop + (cpu * wysPaska));
                g.drawLine(tLewo + (czasyRozpoczecia[zadanie][cpu] * pxPerUnit), tTop + ((cpu+1) * wysPaska), tLewo + (czasyZakonczenia[zadanie][cpu] * pxPerUnit), tTop + ((cpu+1) * wysPaska));

            }
        }
        g.drawLine(tLewo, tTop, tLewo+800, tTop);
        g.drawLine(tLewo, tTop, tLewo, tTop + (10*wysPaska));
        for(int i =0; i<=10;i++)
            g.drawLine(tLewo-2, i*wysPaska, tLewo, i*wysPaska);
        for(int i=0; i<=czasZakonczenia*pxPerUnit;i=i+pxPerUnit)
            g.drawLine(tLewo+i, tTop-2, tLewo+i, tTop);
        String txt = "P";
        g.drawChars(txt.toCharArray(), 0, 1, tLewo-10, tTop+500);
        txt = "t";
        g.drawChars(txt.toCharArray(), 0, 1, tLewo+780, tTop-10);
    }

    public void setInformations() {
        this.czasZakonczenia = r.permutacjeZadan[r.permutacjeZadan.length - 1].jakosc();
        this.liczbaCPU = r.liczbaProcesorow;
        this.liczbaZadan = r.permutacjeZadan[0].tablicaZadan.length;
    }

    public void calcTimes() {
        for (int i = 0; i < liczbaZadan; i++) {
            for (int cpu = 0; cpu < liczbaCPU; cpu++) {
                int t = r.permutacjeZadan[r.permutacjeZadan.length - 1].tablicaZadan[i].czasyNaCPU[cpu];
                if (cpu == 0) {
                    if (i == 0) {
                        czasyRozpoczecia[i][cpu] = 0;
                        czasyZakonczenia[i][cpu] = t;
                    } else {
                        czasyRozpoczecia[i][cpu] = czasyZakonczenia[i - 1][cpu];
                        czasyZakonczenia[i][cpu] = czasyZakonczenia[i - 1][cpu] + t;
                    }
                } else {
                    if (i == 0) {
                        czasyRozpoczecia[i][cpu] = czasyZakonczenia[i][cpu - 1];
                        czasyZakonczenia[i][cpu] = czasyZakonczenia[i][cpu - 1] + t;
                    } else {
                        czasyRozpoczecia[i][cpu] = Math.max(czasyZakonczenia[i - 1][cpu], czasyZakonczenia[i][cpu - 1]);
                        czasyZakonczenia[i][cpu] = Math.max(czasyZakonczenia[i - 1][cpu] + t, czasyZakonczenia[i][cpu - 1] + t);
                    }
                }
//                System.out.print(czasyRozpoczecia[i][cpu]+"::"+czasyZakonczenia[i][cpu]+"\t");
            }
//            System.out.print("\n");
        }
//        System.out.println(czasyZakonczenia[liczbaZadan - 1][liczbaCPU - 1] + " vs " + czasZakonczenia);
    }
}